/*
 * @Description: 
 * @Author: Jimmy
 * @Date: 2023-07-23 10:16:35
 * @LastEditTime: 2023-07-26 19:20:15
 * @LastEditors:  
 */
import { Context } from "koa";
import { callbackData } from "../utils/data.handler";
import { access, sql } from "../logger";
import { pagination } from "../utils/pagination";
import departService from "../service/depart.service";
import userService from "../service/user.service";

class DepartController {
    //新增
    async create(ctx: Context) {
        //获取数据
        const { name, parent_id, code, status = 0 } = ctx.request.body;
        // 操作数据库
        try {
            const res = await departService.create({ name, parent_id, code, status });
            // 返回结果
            access.info('添加部门成功', { name: res.name })
            ctx.body = callbackData('0', '添加部门成功')
        } catch (err) {
            sql.error('添加部门失败', err)
            console.error('添加部门失败', err)
            ctx.app.emit('error', callbackData('3', '添加部门失败'), ctx);
        }
    }
    //删除
    async delete(ctx: Context) {
        let { ids = '' } = JSON.parse(JSON.stringify(ctx.query));
        if (!ids) {
            access.error('请选择删除部门')
            console.error('请选择删除部门')
            ctx.app.emit('error', callbackData('1', '请选择删除部门'), ctx);
            return false;
        }
        try {
            let idBox = ids.split(',');
            let res = await userService.getUserList({username: '', nickname:'', phone:'', page:0, size:0, depart_id:idBox[0], role_id:'', is_admin:'',status:''})
            let { count,rows } = res;
            if(count==0){
                await departService.deleteById(idBox)
                sql.info('删除部门成功', { ids })
                ctx.body = callbackData('0', '删除部门成功')
            }else{
                sql.error('部门有人员，不得删除')
                console.error('部门有人员，不得删除')
                ctx.app.emit('error', callbackData('2', '部门有人员，不得删除'), ctx);
            }
        } catch (err) {
            sql.error('删除部门失败', err)
            console.error('删除部门失败', err)
            ctx.app.emit('error', callbackData('3', '删除部门失败'), ctx);
        }
    }
    //更新
    async update(ctx: Context) {
        const { id, name, parent_id, code, status } = ctx.request.body;
        if (!id) {
            access.error('请选择更新部门')
            console.error('请选择更新部门')
            ctx.app.emit('error', callbackData('1', '请选择更新部门'), ctx);
            return false;
        }
        // 操作数据库
        try {
            await departService.updateById({ id, name, parent_id, code, status });
            // 返回结果
            access.info('更新部门成功', { name })
            ctx.body = callbackData('0', '更新部门成功')
        } catch (err) {
            sql.error('更新部门失败', err)
            console.error('更新部门失败', err)
            ctx.app.emit('error', callbackData('3', '更新部门失败'), ctx);
        }
    }
    //查询列表
    queryList = async (ctx: Context) => {
        //获取数据
        const { id = '', parent_id = '-1', code = '', name = '', status = '' } = JSON.parse(JSON.stringify(ctx.query)) || {};
        const { page = 1, size = 10 } = ctx.request.body;
        try {
            //从返回结果中剔除password，其他属性放入新的对象中
            const res = await departService.getList({ id, parent_id, code, name, status, size, page })
            // 返回结果
            if (res) {
                let count = 0;
                let rows = [];
                let list = []
                if (page && size) {
                    count = res.count;
                    rows = res.rows;
                } else {
                    rows = res;
                }
                if (rows.length) {
                    console.log(rows)
                    list = await this.getAll(rows, status);
                }
                sql.info('查询成功', { name, page, size, status, code })
                ctx.body = callbackData('0', '查询成功', (page && size) ? pagination(rows, page, count, size) : list)
            } else {
                sql.error('部门列表查询失败', { name, page, size, status, code })
                console.error('部门列表查询失败', { name, page, size, status, code })
                ctx.app.emit('error', callbackData('3', '部门列表查询失败'), ctx);
            }
        } catch (err) {
            sql.error('部门列表查询失败', err)
            console.error('部门列表查询失败', err)
            ctx.app.emit('error', callbackData('3', '部门列表查询失败'), ctx);
        }
    }
    //根据id 状态查询所有
    getAll = (data, status) => {
        if (data && data.length) {
            var promiseBox = data.map(async (item: { children?: any; id?: any; }) => {
                let { id } = item
                let children = await departService.getList({ parent_id: id, status });
                if (children && children.length) {
                    item.children = await this.getAll(children, status)
                } else {
                    item.children = [];
                }
                return item;
            })
            return Promise.all(promiseBox).then(res=>{
                return res;
            })
        }
    }
}

export default new DepartController